package ar.edu.ufasta.presupuestos.logica.entidades.articulo;

import java.util.ArrayList;
import java.util.List;

import ar.edu.ufasta.presupuestos.logica.entidades.Costo;
import ar.edu.ufasta.presupuestos.logica.entidades.EntidadBase;
import ar.edu.ufasta.presupuestos.logica.entidades.Fabrica;
import ar.edu.ufasta.presupuestos.logica.entidades.Proveedor;
import ar.edu.ufasta.presupuestos.servicios.inventario.InventarioFacade;

/**
 * @author Carlos Gaspar y Juan Pablo Ruiz
 * @version 0.0.0.1 Universidad FASTA
 * 
 * Clase Objeto de Negocio -> Articulo
 */
public abstract class Articulo extends EntidadBase{

	/*
	 * (non-javadoc)
	 */
	@SuppressWarnings("unused")
	private Integer cantidad;
	private String descripcion;
	private String nombre;
	private TipoArticulo tipoArticulo;
	private List<Costo> costos;
	private Proveedor proveedor;
	private Fabrica fabrica;
	private Integer cantidadMinima;
	
	
	public Integer getCantidadMinima() {
		return cantidadMinima;
	}

	public void setCantidadMinima(Integer cantidadMinima) {
		this.cantidadMinima = cantidadMinima;
	}

	public Fabrica getFabrica() {
		return fabrica;
	}

	public void setFabrica(Fabrica fabrica) {
		this.fabrica = fabrica;
	}

	public Proveedor getProveedor() {
		return proveedor;
	}

	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}

	public Articulo() {
		this.costos = new ArrayList<Costo>();
	}
	
	public void setTipoArticulo(TipoArticulo tipoArticulo) {
		this.tipoArticulo = tipoArticulo;
	}

	public TipoArticulo getTipoArticulo() {
		return tipoArticulo;
	}
	
	/**
	 * Getter of the property <tt>cantidad</tt>
	 * 
	 * @return Returns the cantidad.
	 * 
	 */
	public Integer getCantidad() {
		return InventarioFacade.getInstancia().getStock(this);
	}

	/**
	 * Setter of the property <tt>cantidad</tt>
	 * 
	 * @param cantidad
	 *            The cantidad to set.
	 * 
	 */
	public void setCantidad(Integer cantidad) {
		//InventarioJP.getInstance().stockAjustement(this, cantidad);
		this.cantidad = cantidad;
	}



	/**
	 * Getter of the property <tt>costo</tt>
	 * 
	 * @return Returns the costo.
	 * 
	 */
	public Double getCosto() {
		if(!this.costos.isEmpty() && this.costos.get(0)!=null)
			return costos.get(0).getCosto();
		else
			return null;
	}

	/**
	 * Setter of the property <tt>costo</tt>
	 * 
	 * @param costo
	 *            The costo to set.
	 * 
	 */
	public void setCosto(Double costo) {
		Costo cost = new Costo(costo);
		if(!this.costos.isEmpty() && this.costos.get(0)!=null)
			this.costos.remove(0);
		this.costos.add(0, cost);
		
	}

	/**
	 * Getter of the property <tt>costo</tt>
	 * 
	 * @return Returns the costo.
	 * 
	 */
	public Double getCostoUnitario() {
		if(!this.costos.isEmpty() && this.costos.size()>1)
			return this.costos.get(1).getCosto();
		else
			return null;
	}

	/**
	 * Setter of the property <tt>costo</tt>
	 * 
	 * @param costo
	 *            The costo to set.
	 * 
	 */
	public void setCostoUnitario(Double costo) {
		Costo cost = new Costo(costo);
		if(!this.costos.isEmpty() && this.costos.size()>1 && this.costos.get(1)!=null)
			this.costos.remove(1);
		this.costos.add(1, cost);
	}

	

	/**
	 * Getter of the property <tt>descripcion</tt>
	 * 
	 * @return Returns the descripcion.
	 * 
	 */
	public String getDescripcion() {
		return descripcion;
	}

	/**
	 * Setter of the property <tt>descripcion</tt>
	 * 
	 * @param descripcion
	 *            The descripcion to set.
	 * 
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	/**
	 * Getter of the property <tt>nombre</tt>
	 * 
	 * @return Returns the nombre.
	 * 
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * Setter of the property <tt>nombre</tt>
	 * 
	 * @param nombre
	 *            The nombre to set.
	 * 
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	
	public Integer getStock(){
		return InventarioFacade.getInstancia().getStock(this);
	}
	
}
